2.4 多权限作用影响

在实际使用中,1个用户经常会授权多个角色,也就是1个用户可以授权多个权限。那多个权限是如何互相作用和影响的?我们需要分不同权限类型来看。

1.功能权限

多个功能权限之间不存在冲突,可以并集累加上去,但同一页面需要去重。

比如项目经理,即需要访问信息发布页面,也需要访问销售订单页面,就可以把这两个页面的功能权限分配给这个角色。例子如下表所示:

功能权限1 功能权限2 功能权限3 授权结果
信息发布页面 销售订单页面 销售订单页面 信息发布页面、销售订单页面

2.数据权限

数据权限的多权限作用影响需要区分不同的操作来看。

(1)查询数据

查询数据优先满足行权限(也就是先要符合where条件),如果存在多个权限,这些权限的行权限做or操作,权限的列字段做一个交集来返回。列字段做交集返回目的是在有查询条件的情况,尽可能降低用户的访问范围,保护数据隐私。

比如在查看信息发布数据,有的用户只能查看状态为正常的信息,管理员用户可以同时查看正常和删除的信息,这样可以给管理员用户同时分配这2个权限。例子如下表所示:

查询数据权限1 查询数据权限2 查询结果
title,status
where status=1
title,type
where status=1
title
where status=1
title,status
where status=1
title,type
where status=0
title
where status=1 or status = 0
所有列
where status=1 and type='新闻公告'
title,type
where status=0
title,type
where (status=1 and type='新闻公告') or status=0

查询数据会受到“单独使用的列权限”和“只有返回的列在权限指定的列范围内时才应用”这两个选项的影响,比如设置了“单独使用的列权限”,原来多个权限列字段的交集返回会改成并集返回,具体实现效果参考 2.2 数据权限 章节中的高级特性内容。

(2)插入数据

插入数据的操作,主要是判断列权限是否符合要求。

多个权限的列权限不会并集累加,而是取满足条件的权限进行使用,如果其中有1个权限满足条件,则判断成功。

比如信息管理员拥有多个信息发布的插入权限,当出现插入数据操作,会遍历这些权限,直到找到满足插入这些字段的权限。如果未找到,则提示无权限,插入失败。例子如下表所示:

例子:插入的列 插入数据权限1 插入数据权限2 插入数据权限3 处理结果
fid,title,type,status fid,title(不满足要求) fid,title,type,status(满足要求) fid,person,title,type,status(满足要求) 插入成功
fid,title,type,status fid,title(不满足要求) type,status(不满足要求) 插入失败
fid,title,type,status fid,title(不满足要求) 所有列(满足要求) 插入成功
fid,title,type=新闻公告,status type=新闻公告(不满足要求) 所有列(满足要求) 插入成功
fid,title,type=新闻公告,status type=新闻公告(不满足要求) 所有列(满足要求) fid,title,type=新闻公告,status(满足要求) 插入成功

(3)删除数据

删除数据的操作只有行权限(也就是where条件),对同一个数据集进行删除,多个权限可以对不同的where条件进行or操作。

需要注意的是,如果某删除数据权限未设置任何过滤条件,再和其他有过滤条件的进行组合,则这个无过滤条件不会起作用。

比如信息管理员拥有多个信息发布的删除权限,这些删除权限的where条件会进行并集操作,当出现删除数据操作时,只要符合其中一项条件,数据就可以被成功删除,否则删除失败。例子如下表所示:

例子:删除的列 删除数据权限1 删除数据权限2 删除数据权限3 授权结果 处理结果
status = 0 status = 0 type = '新闻公告' type = '财务公告' status = 0 or type = '新闻公告' or type = '财务公告' 删除成功
type = '置顶公告' status = 0 type = '新闻公告' 有删除数据权限,但未设置where条件 status = 0 or type = '新闻公告' 删除失败
type = '置顶公告' 有删除数据权限,但未设置where条件 不限定条件 删除成功

(4)更新数据

更新数据的操作需要同时判断列权限和行权限,先判断列权限(优先使用有行权限配置的进行判断),再判断行权限(也就是where条件)。

比如信息管理员拥有多个信息发布的更新权限,判断过程如下:

1、当出现更新数据操作时,会优先查找带where条件的权限,判断该权限的字段是否满足更新操作的字段,如果字段满足则判断where条件是否满足,满足则更新成功;

2、不满足则继续查找下一个带where条件的权限。如果带where条件的权限都不满足,则更新失败。

3、如果只有不带where条件的权限,会判断该权限的字段是否满足更新操作的字段,满足则更新成功。

例子如下表所示:

例子:更新的列 更新数据权限1 更新数据权限2 判断过程 处理结果
fid,type,status
where type='新闻公告'
所有列
where条件未设置
fid,type,status
where type='置顶公告'
列权限:找到符合的权限2;
行权限:权限2不符合
更新失败
fid,type,status
where type='新闻公告'
所有列
where条件未设置
列权限:找到符合的权限1;
行权限:权限1符合
更新成功
fid,type,status=1
where type='新闻公告'
fid,type,status=0
where type='新闻公告'
fid,type,status
where type='置顶公告'
列权限:找到符合的权限2;
行权限:权限2不符合
更新失败
fid,type,status=1
where type='置顶公告'
所有列
where条件未设置
所有列
where type='新闻公告'
列权限:找到符合的权限2;
行权限:权限2不符合
更新失败
fid,type,status=1
where type='置顶公告'
所有列
where条件未设置
type,status=1
where type='新闻公告'
列权限:找到符合的权限1;
行权限:权限1符合
更新成功

3.API权限

API权限跟功能权限比较类似,多个权限之间不存在冲突,可以并集累加上去,但同一服务需要去重。

比如项目经理,即需要修改信息备注,也需要修改订单状态,就可以把这两个服务的API权限分配给这个角色。例子如下表所示:

API权限1 API权限2 API权限3 授权结果
修改信息备注服务 修改订单状态服务 修改订单状态服务 修改信息备注服务、修改订单状态服务

results matching ""

    No results matching ""

    results matching ""

      No results matching ""